package main.leetcode.offer.firstround.from03to50;

import java.util.Arrays;

/**
 * 29.顺时针打印矩阵
 *
 * <p>输入一个矩阵，按照从外向里以顺时针的顺序依次打印出每一个数字。
 *
 * <p>
 *
 * <p>示例 1： 输入：matrix = [[1,2,3],[4,5,6],[7,8,9]] 输出：[1,2,3,6,9,8,7,4,5]
 *
 * <p>示例 2： 输入：matrix = [[1,2,3,4],[5,6,7,8],[9,10,11,12]] 输出：[1,2,3,4,8,12,11,10,9,5,6,7]
 *
 * <p>限制：0 <= matrix.length <= 100 0 <= matrix[i].length <= 100
 *
 * <p>来源：力扣（LeetCode） 链接：https://leetcode-cn.com/problems/shun-shi-zhen-da-yin-ju-zhen-lcof
 * 著作权归领扣网络所有。商业转载请联系官方授权，非商业转载请注明出处。
 */
public class ex29 {
    public static void main(String[] args) {
        System.out.println(
                Arrays.toString(
                        new ex29()
                                .spiralOrder(
                                        new int[][] {
                                            {1, 2, 3, 4},
                                            {5, 6, 7, 8},
                                            {9, 10, 11, 12},
                                            {13, 14, 15, 16}
                                        })));
    }

    public int[] spiralOrder(int[][] matrix) {
        if (matrix.length == 0) return new int[] {};
        int m = matrix.length;
        int n = matrix[0].length;
        int[] res = new int[m * n];

        int i = 0, j = 0;
        int k = 0;
        int up = 0, down = m, left = -1, right = n;
        while (k < m * n - 1) {
            while (k < m * n - 1 && j + 1 < right) res[k++] = matrix[i][j++];
            right--;
            while (k < m * n - 1 && i + 1 < down) res[k++] = matrix[i++][j];
            down--;
            while (k < m * n - 1 && j - 1 > left) res[k++] = matrix[i][j--];
            left++;
            while (k < m * n - 1 && i - 1 > up) res[k++] = matrix[i--][j];
            up++;
        }
        res[k] = matrix[i][j];
        return res;
    }
}
